/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AdmonHorarios;

import AdmonHorarios.exceptions.IllegalOrphanException;
import AdmonHorarios.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidades.Semestre;
import Entidades.Asignacionseccioncurso;
import Entidades.Aula;
import Entidades.Asignacionperiodocurso;
import Entidades.Horariocurso;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Ch470
 */
public class HorariocursoJpaController implements Serializable {

    public HorariocursoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Horariocurso horariocurso) {
        if (horariocurso.getAsignacionperiodocursoCollection() == null) {
            horariocurso.setAsignacionperiodocursoCollection(new ArrayList<Asignacionperiodocurso>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Semestre semestreidSemestre = horariocurso.getSemestreidSemestre();
            if (semestreidSemestre != null) {
                semestreidSemestre = em.getReference(semestreidSemestre.getClass(), semestreidSemestre.getIdSemestre());
                horariocurso.setSemestreidSemestre(semestreidSemestre);
            }
            Asignacionseccioncurso asignacionSeccionCursoidAsignacionSeccionCurso = horariocurso.getAsignacionSeccionCursoidAsignacionSeccionCurso();
            if (asignacionSeccionCursoidAsignacionSeccionCurso != null) {
                asignacionSeccionCursoidAsignacionSeccionCurso = em.getReference(asignacionSeccionCursoidAsignacionSeccionCurso.getClass(), asignacionSeccionCursoidAsignacionSeccionCurso.getIdAsignacionSeccionCurso());
                horariocurso.setAsignacionSeccionCursoidAsignacionSeccionCurso(asignacionSeccionCursoidAsignacionSeccionCurso);
            }
            Aula aulaidAula = horariocurso.getAulaidAula();
            if (aulaidAula != null) {
                aulaidAula = em.getReference(aulaidAula.getClass(), aulaidAula.getIdAula());
                horariocurso.setAulaidAula(aulaidAula);
            }
            Collection<Asignacionperiodocurso> attachedAsignacionperiodocursoCollection = new ArrayList<Asignacionperiodocurso>();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionAsignacionperiodocursoToAttach : horariocurso.getAsignacionperiodocursoCollection()) {
                asignacionperiodocursoCollectionAsignacionperiodocursoToAttach = em.getReference(asignacionperiodocursoCollectionAsignacionperiodocursoToAttach.getClass(), asignacionperiodocursoCollectionAsignacionperiodocursoToAttach.getIdAsignacionPeriodoCurso());
                attachedAsignacionperiodocursoCollection.add(asignacionperiodocursoCollectionAsignacionperiodocursoToAttach);
            }
            horariocurso.setAsignacionperiodocursoCollection(attachedAsignacionperiodocursoCollection);
            em.persist(horariocurso);
            if (semestreidSemestre != null) {
                semestreidSemestre.getHorariocursoCollection().add(horariocurso);
                semestreidSemestre = em.merge(semestreidSemestre);
            }
            if (asignacionSeccionCursoidAsignacionSeccionCurso != null) {
                asignacionSeccionCursoidAsignacionSeccionCurso.getHorariocursoCollection().add(horariocurso);
                asignacionSeccionCursoidAsignacionSeccionCurso = em.merge(asignacionSeccionCursoidAsignacionSeccionCurso);
            }
            if (aulaidAula != null) {
                aulaidAula.getHorariocursoCollection().add(horariocurso);
                aulaidAula = em.merge(aulaidAula);
            }
            for (Asignacionperiodocurso asignacionperiodocursoCollectionAsignacionperiodocurso : horariocurso.getAsignacionperiodocursoCollection()) {
                Horariocurso oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionAsignacionperiodocurso = asignacionperiodocursoCollectionAsignacionperiodocurso.getHorarioCursoidHorarioCurso();
                asignacionperiodocursoCollectionAsignacionperiodocurso.setHorarioCursoidHorarioCurso(horariocurso);
                asignacionperiodocursoCollectionAsignacionperiodocurso = em.merge(asignacionperiodocursoCollectionAsignacionperiodocurso);
                if (oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionAsignacionperiodocurso != null) {
                    oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionAsignacionperiodocurso.getAsignacionperiodocursoCollection().remove(asignacionperiodocursoCollectionAsignacionperiodocurso);
                    oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionAsignacionperiodocurso = em.merge(oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionAsignacionperiodocurso);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Horariocurso horariocurso) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Horariocurso persistentHorariocurso = em.find(Horariocurso.class, horariocurso.getIdHorarioCurso());
            Semestre semestreidSemestreOld = persistentHorariocurso.getSemestreidSemestre();
            Semestre semestreidSemestreNew = horariocurso.getSemestreidSemestre();
            Asignacionseccioncurso asignacionSeccionCursoidAsignacionSeccionCursoOld = persistentHorariocurso.getAsignacionSeccionCursoidAsignacionSeccionCurso();
            Asignacionseccioncurso asignacionSeccionCursoidAsignacionSeccionCursoNew = horariocurso.getAsignacionSeccionCursoidAsignacionSeccionCurso();
            Aula aulaidAulaOld = persistentHorariocurso.getAulaidAula();
            Aula aulaidAulaNew = horariocurso.getAulaidAula();
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionOld = persistentHorariocurso.getAsignacionperiodocursoCollection();
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionNew = horariocurso.getAsignacionperiodocursoCollection();
            List<String> illegalOrphanMessages = null;
            for (Asignacionperiodocurso asignacionperiodocursoCollectionOldAsignacionperiodocurso : asignacionperiodocursoCollectionOld) {
                if (!asignacionperiodocursoCollectionNew.contains(asignacionperiodocursoCollectionOldAsignacionperiodocurso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Asignacionperiodocurso " + asignacionperiodocursoCollectionOldAsignacionperiodocurso + " since its horarioCursoidHorarioCurso field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (semestreidSemestreNew != null) {
                semestreidSemestreNew = em.getReference(semestreidSemestreNew.getClass(), semestreidSemestreNew.getIdSemestre());
                horariocurso.setSemestreidSemestre(semestreidSemestreNew);
            }
            if (asignacionSeccionCursoidAsignacionSeccionCursoNew != null) {
                asignacionSeccionCursoidAsignacionSeccionCursoNew = em.getReference(asignacionSeccionCursoidAsignacionSeccionCursoNew.getClass(), asignacionSeccionCursoidAsignacionSeccionCursoNew.getIdAsignacionSeccionCurso());
                horariocurso.setAsignacionSeccionCursoidAsignacionSeccionCurso(asignacionSeccionCursoidAsignacionSeccionCursoNew);
            }
            if (aulaidAulaNew != null) {
                aulaidAulaNew = em.getReference(aulaidAulaNew.getClass(), aulaidAulaNew.getIdAula());
                horariocurso.setAulaidAula(aulaidAulaNew);
            }
            Collection<Asignacionperiodocurso> attachedAsignacionperiodocursoCollectionNew = new ArrayList<Asignacionperiodocurso>();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach : asignacionperiodocursoCollectionNew) {
                asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach = em.getReference(asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach.getClass(), asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach.getIdAsignacionPeriodoCurso());
                attachedAsignacionperiodocursoCollectionNew.add(asignacionperiodocursoCollectionNewAsignacionperiodocursoToAttach);
            }
            asignacionperiodocursoCollectionNew = attachedAsignacionperiodocursoCollectionNew;
            horariocurso.setAsignacionperiodocursoCollection(asignacionperiodocursoCollectionNew);
            horariocurso = em.merge(horariocurso);
            if (semestreidSemestreOld != null && !semestreidSemestreOld.equals(semestreidSemestreNew)) {
                semestreidSemestreOld.getHorariocursoCollection().remove(horariocurso);
                semestreidSemestreOld = em.merge(semestreidSemestreOld);
            }
            if (semestreidSemestreNew != null && !semestreidSemestreNew.equals(semestreidSemestreOld)) {
                semestreidSemestreNew.getHorariocursoCollection().add(horariocurso);
                semestreidSemestreNew = em.merge(semestreidSemestreNew);
            }
            if (asignacionSeccionCursoidAsignacionSeccionCursoOld != null && !asignacionSeccionCursoidAsignacionSeccionCursoOld.equals(asignacionSeccionCursoidAsignacionSeccionCursoNew)) {
                asignacionSeccionCursoidAsignacionSeccionCursoOld.getHorariocursoCollection().remove(horariocurso);
                asignacionSeccionCursoidAsignacionSeccionCursoOld = em.merge(asignacionSeccionCursoidAsignacionSeccionCursoOld);
            }
            if (asignacionSeccionCursoidAsignacionSeccionCursoNew != null && !asignacionSeccionCursoidAsignacionSeccionCursoNew.equals(asignacionSeccionCursoidAsignacionSeccionCursoOld)) {
                asignacionSeccionCursoidAsignacionSeccionCursoNew.getHorariocursoCollection().add(horariocurso);
                asignacionSeccionCursoidAsignacionSeccionCursoNew = em.merge(asignacionSeccionCursoidAsignacionSeccionCursoNew);
            }
            if (aulaidAulaOld != null && !aulaidAulaOld.equals(aulaidAulaNew)) {
                aulaidAulaOld.getHorariocursoCollection().remove(horariocurso);
                aulaidAulaOld = em.merge(aulaidAulaOld);
            }
            if (aulaidAulaNew != null && !aulaidAulaNew.equals(aulaidAulaOld)) {
                aulaidAulaNew.getHorariocursoCollection().add(horariocurso);
                aulaidAulaNew = em.merge(aulaidAulaNew);
            }
            for (Asignacionperiodocurso asignacionperiodocursoCollectionNewAsignacionperiodocurso : asignacionperiodocursoCollectionNew) {
                if (!asignacionperiodocursoCollectionOld.contains(asignacionperiodocursoCollectionNewAsignacionperiodocurso)) {
                    Horariocurso oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso = asignacionperiodocursoCollectionNewAsignacionperiodocurso.getHorarioCursoidHorarioCurso();
                    asignacionperiodocursoCollectionNewAsignacionperiodocurso.setHorarioCursoidHorarioCurso(horariocurso);
                    asignacionperiodocursoCollectionNewAsignacionperiodocurso = em.merge(asignacionperiodocursoCollectionNewAsignacionperiodocurso);
                    if (oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso != null && !oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso.equals(horariocurso)) {
                        oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso.getAsignacionperiodocursoCollection().remove(asignacionperiodocursoCollectionNewAsignacionperiodocurso);
                        oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso = em.merge(oldHorarioCursoidHorarioCursoOfAsignacionperiodocursoCollectionNewAsignacionperiodocurso);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = horariocurso.getIdHorarioCurso();
                if (findHorariocurso(id) == null) {
                    throw new NonexistentEntityException("The horariocurso with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Horariocurso horariocurso;
            try {
                horariocurso = em.getReference(Horariocurso.class, id);
                horariocurso.getIdHorarioCurso();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The horariocurso with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Asignacionperiodocurso> asignacionperiodocursoCollectionOrphanCheck = horariocurso.getAsignacionperiodocursoCollection();
            for (Asignacionperiodocurso asignacionperiodocursoCollectionOrphanCheckAsignacionperiodocurso : asignacionperiodocursoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Horariocurso (" + horariocurso + ") cannot be destroyed since the Asignacionperiodocurso " + asignacionperiodocursoCollectionOrphanCheckAsignacionperiodocurso + " in its asignacionperiodocursoCollection field has a non-nullable horarioCursoidHorarioCurso field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Semestre semestreidSemestre = horariocurso.getSemestreidSemestre();
            if (semestreidSemestre != null) {
                semestreidSemestre.getHorariocursoCollection().remove(horariocurso);
                semestreidSemestre = em.merge(semestreidSemestre);
            }
            Asignacionseccioncurso asignacionSeccionCursoidAsignacionSeccionCurso = horariocurso.getAsignacionSeccionCursoidAsignacionSeccionCurso();
            if (asignacionSeccionCursoidAsignacionSeccionCurso != null) {
                asignacionSeccionCursoidAsignacionSeccionCurso.getHorariocursoCollection().remove(horariocurso);
                asignacionSeccionCursoidAsignacionSeccionCurso = em.merge(asignacionSeccionCursoidAsignacionSeccionCurso);
            }
            Aula aulaidAula = horariocurso.getAulaidAula();
            if (aulaidAula != null) {
                aulaidAula.getHorariocursoCollection().remove(horariocurso);
                aulaidAula = em.merge(aulaidAula);
            }
            em.remove(horariocurso);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Horariocurso> findHorariocursoEntities() {
        return findHorariocursoEntities(true, -1, -1);
    }

    public List<Horariocurso> findHorariocursoEntities(int maxResults, int firstResult) {
        return findHorariocursoEntities(false, maxResults, firstResult);
    }

    private List<Horariocurso> findHorariocursoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Horariocurso.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Horariocurso findHorariocurso(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Horariocurso.class, id);
        } finally {
            em.close();
        }
    }

    public int getHorariocursoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Horariocurso> rt = cq.from(Horariocurso.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
